Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(share_plus)!: SharePlus refactor #3404

Open
wants to merge 24 commits into
base: main
Choose a base branch
from

Conversation

miquelbeltran
Copy link
Member

@miquelbeltran miquelbeltran commented Dec 18, 2024

Description

This PR contains several improvements on the share_plus package:

  • Unified the 3 static methods into a single non-static method.
  • Access to SharePlus class via instance singleton, rather than using static methods.
  • Allow to mock SharePlatform for testing.
  • Consolidated the use of subject and title.
  • Wrapped all share parameters into the ShareParams class.
  • Unified native share implementations into a single method (when possible).
  • Added mailToFallbackEnabled to disable web mailTo failback (enabled by default)
  • downloadFallbackEnabled is no longer a static setting but part of the ShareParams
  • Sharing uri is now supported on all platforms by sharing the URI as plain text

Not a breaking change, since the old API is still compatible, only it has been deprecated.
But we should consider bumping the version of share_plus to a major release nevertheless, since the deprecation will break CI/CD lint analysis.

TODO:

  • Implement Linux
  • Implement macOS
  • Implement Android
  • Implement iOS
  • Implement Windows Native
  • Implement Windows Fallback
  • Implement Web
  • Implement new tests
  • Document public method

Related Issues

Checklist

  • I read the Contributor Guide and followed the process outlined there for submitting PRs.
  • I titled the PR using Conventional Commits.
  • I did not modify the CHANGELOG.md nor the plugin version in pubspec.yaml files.
  • All existing and new tests are passing.
  • The analyzer (flutter analyze) does not report any problems on my PR.

Breaking Change

Does your PR require plugin users to manually update their apps to accommodate your change?

  • Yes, this is a breaking change (please indicate that with a ! in the title as explained in Conventional Commits).
  • No, this is not a breaking change.

@miquelbeltran
Copy link
Member Author

One last big piece missing is the Windows refactor, which I plan to do tomorrow or so.

Then I'll write up a migration guide on the README.md.

The API and functionality is still backwards compatible, but just getting deprecated warnings. The old Share class will be removed eventually.

The subject and title functionality has been consolidated:

  • title is used everywhere where the value is used in the share sheet as title.
  • subject is used for email subjects
    • on iOS and macOS, to keep compatibility and avoid having a breaking change, it will use the subject if title is not provided, for the share sheet title.

@miquelbeltran miquelbeltran marked this pull request as ready for review December 20, 2024 09:45
@miquelbeltran miquelbeltran changed the title feat(share_plus): SharePlus refactor (WIP) feat(share_plus): SharePlus refactor Dec 20, 2024
@miquelbeltran
Copy link
Member Author

I will review this again later tonight and merge if everything looks ok still

@StanleyCocos
Copy link
Contributor

@miquelbeltran
Do you have any plans? This request seems to have been pending for a long time.
Sorry for bothering you.

@miquelbeltran
Copy link
Member Author

Hey @StanleyCocos I am very sorry I wanted to have this done during the winter break, and then I got sidetracked. Can I ask you a favor? Could you take a look and give me a review?

@miquelbeltran miquelbeltran self-assigned this Apr 1, 2025
@miquelbeltran miquelbeltran requested a review from Copilot April 1, 2025 11:44
Copy link

@Copilot Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull Request Overview

This PR refactors the share_plus package by unifying sharing methods into a single non-static approach using a singleton instance and the ShareParams class.

  • Consolidated sharing methods into a single instance method call.
  • Updated examples and documentation in the README.md to reflect the new API usage.
  • Added a migration guide for converting from the deprecated static API.
Files not reviewed (19)
  • packages/share_plus/share_plus/android/src/main/kotlin/dev/fluttercommunity/plus/share/MethodCallHandler.kt: Language not supported
  • packages/share_plus/share_plus/android/src/main/kotlin/dev/fluttercommunity/plus/share/Share.kt: Language not supported
  • packages/share_plus/share_plus/example/ios/Runner/AppDelegate.swift: Language not supported
  • packages/share_plus/share_plus/example/lib/main.dart: Language not supported
  • packages/share_plus/share_plus/example/windows/flutter/CMakeLists.txt: Language not supported
  • packages/share_plus/share_plus/example/windows/runner/Runner.rc: Language not supported
  • packages/share_plus/share_plus/ios/share_plus/Sources/share_plus/FPPSharePlusPlugin.m: Language not supported
  • packages/share_plus/share_plus/lib/share_plus.dart: Language not supported
  • packages/share_plus/share_plus/lib/src/share_plus_linux.dart: Language not supported
  • packages/share_plus/share_plus/lib/src/share_plus_web.dart: Language not supported
  • packages/share_plus/share_plus/lib/src/share_plus_windows.dart: Language not supported
  • packages/share_plus/share_plus/macos/share_plus/Sources/share_plus/SharePlusMacosPlugin.swift: Language not supported
  • packages/share_plus/share_plus/test/share_plus_linux_test.dart: Language not supported
  • packages/share_plus/share_plus/test/share_plus_test.dart: Language not supported
  • packages/share_plus/share_plus/test/share_plus_windows_test.dart: Language not supported
  • packages/share_plus/share_plus/windows/share_plus_plugin.cpp: Language not supported
  • packages/share_plus/share_plus/windows/share_plus_windows_plugin.h: Language not supported
  • packages/share_plus/share_plus_platform_interface/lib/method_channel/method_channel_share.dart: Language not supported
  • packages/share_plus/share_plus_platform_interface/lib/platform_interface/share_plus_platform.dart: Language not supported

@miquelbeltran miquelbeltran changed the title feat(share_plus): SharePlus refactor feat(share_plus)!: SharePlus refactor Apr 4, 2025
@miquelbeltran
Copy link
Member Author

Fixing the analysis errors, and main is merged in as well.

I am going to mark this as a breaking change, although technically it is not, using this package will cause deprecated warnings to appear and the change is big enough that it deserves it.

I am setting myself the goal to merge this by April 18th (two weeks from now). Please, @StanleyCocos and anyone else interested, I'd appreciate a lot to have a review of the changes.

@StanleyCocos
Copy link
Contributor

Of course, I’ll try to take a look and offer some suggestions from my side. Things have been quite busy for me recently, but as you mentioned, the merge is in two weeks — I’ll do my best to wrap this up before then. Thanks again!

throw ArgumentError(
'fileNameOverrides must have the same length as files.',
);
}

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Since Share.downloadFallbackEnabled is a global parameter, we cannot override the functionality already configured by the user. For example, if the user has set Share.downloadFallbackEnabled = false, but the default in ShareParams is true.

/// Cannot be used in combination with [text].
///
/// * Supported platforms: iOS, Android
/// Fallsback to sharing the URI as text on other platforms.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fallsback to Falls back


return ShareResult(result, _statusFromResult(result));
return map;
}

/// Ensure that a file is readable from the file system. Will create file on-demand under TemporaryDiectory and return the temporary file otherwise.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

TemporaryDiectory to TemporaryDirectory

files: [XFile(fd.path)],
),
);
verify(mockChannel.invokeMethod<String>('share', <String, dynamic>{
'paths': [fd.path],
'mimeTypes': ['image/png'],
}));
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think we can add some mock data for ShareResult. Right now, it seems we only see ShareResult.unavailable.

@StanleyCocos
Copy link
Contributor

Can we add some test cases specifically for sharing to ensure the platform-side code works correctly?
https://github.com/fluttercommunity/plus_plugins/blob/main/packages/share_plus/share_plus/example/ios/RunnerTests/RunnerTests.swift

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
2 participants